import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        /**
         * 关于数据结构
         *      1.课堂实现多做
         *      2.课堂讲解题目多刷
         *      3.多画图
         */
    }
    /**
     * 力扣->709.转换成小写字母
     *
     * 解题步骤:
     *      1.遍历字符串
     *      2.判断是否为字母(题中提到,字符串内可能是其他字符)
     *      3.判断是否为大写字母
     *      4.追加
     *      5.返回
     *
     * 使用到的方法
     *      1.s.charAt(i),获取字符串i下标字符
     *      2.Character.isLetter(ch),判断字符是否是字母
     *      3.Character.isUpperCase(ch),判断字符是否是大写字母,判断小写Character.isLowerCase(字符)
     *      4.stringBuilder.append(),字符串追加
     *      5.stringBuilder.toString(),stringBuilder转String
     */
    public String toLowerCase(String s) {
        StringBuilder stringBuilder = new StringBuilder();

        for(int i = 0;i < s.length();i++) {
            char ch = s.charAt(i);
            if(Character.isLetter(ch)) {
                if(Character.isUpperCase(ch)) {
                    ch = (char)(ch + 32);
                }
            }

            stringBuilder.append(ch);
        }

        return stringBuilder.toString();
    }
    /**
     * 力扣->434.字符串中的单词数
     *      1.根据空格进行分割
     *      2.因为空格分割后,会产生空字符串"",虽然为空但是依然会在数组中占用空间,所以使用循环进行筛选不为空字符串,并计数
     *      3.return count
     *
     * 使用到的方法
     *      s.split->字符串分割
     *      ss.length()->求字符串长度
     */
    public int countSegments(String s) {
        int count = 0;//计数

        String[] ret = s.split(" ");//1
        for(String ss : ret) {//2
            if(ss.length() != 0) {
                count++;
            }
        }

        return count;//3
    }
    /**
     * 力扣->88.合并两个有序数组
     * 解题步骤:
     *      1.创建3个变量,分别指向数组1存储个数最后一个位置,数组1长度最后一个位置,数组2存储个数下标
     *      2.通过循环,判断i j 大小,大的放到k位置,大下标改变,k下标改变
     *      3.如果一个数组先循环完,另一个数组可能还有值,在循环外,再使用两个循环进行判断
     *      4.如果i循环完,证明j内还有值,需要放入数组1内
     *      5.如果j循环完,证明i内还有值,需要放入数组1内(可以不放),因为i本来就是数组1下标,放入之后,证明k前面的都是较小值
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        //1
        int i = m - 1;
        int j = n - 1;
        int k = m + n - 1;
        //2
        while(i >= 0 && j >= 0) {
            //3
            if(nums1[i] >= nums2[j]) {
                nums1[k] = nums1[i];
                k--;
                i--;
            }else {
                nums1[k] = nums2[j];
                k--;
                j--;
            }
        }
        //5
        while(k >= 0 && i >= 0) {
            nums1[k] = nums1[i];
            k--;
            i--;
        }
        //4
        while(k >= 0 && j >= 0) {
            nums1[k] = nums2[j];
            k--;
            j--;
        }
    }
    /**
     * 牛客->OR46 字符集合
     * 步骤:
     *      1.设计一个boolean数组,用来判断字母是否已经存在
     *      2.遍历字符串,获取单个字符,放入boolean中进行判断
     *      3.为false则使用stringBuilder进行拼接,然后更改boolean值,为true,忽略
     *      4.StringBuilder转String返回打印即可(两种方法)
     *
     * 使用到的方法:
     *      1.stringBuilder.append(),字符串追加
     *      2.stringBuilder.toString(),字符串转换
     */
        public static String func(String str) {
            boolean[] flag = new boolean[127];//1
            StringBuilder stringBuilder = new StringBuilder();

            for(int i = 0;i < str.length();i++) {//2
                char ch = str.charAt(i);//3
                if(flag[ch] == false) {
                    stringBuilder.append(ch);
                    flag[ch] = true;
                }
            }

            return stringBuilder.toString();//4
        }
        public static void main1(String[] args) {
            Scanner in = new Scanner(System.in);
            while (in.hasNextLine()) {
                String str = in.nextLine();

                String ret = func(str);

                System.out.println(ret);
            }
        }
}
